package consul

import (
	"fmt"
)

const (
	ErrServiceNotFound   = "service not found"
	ErrInvalidConfigType = "invalid config type"
	TypeService          = "service"
	TypeDiscovery        = "discovery"
)

type Config struct {
	// Consul 服务器地址
	Address string `json:"address"`

	// 配置类型: "client" 或 "server"
	Type string `json:"type"`

	// 服务配置（用于服务注册）
	Service *ServiceConfig `json:"service"`

	// 服务发现配置（用于客户端）
	Discovery *DiscoveryConfig `json:"discovery,omitempty"`
}

func (c *Config) IsService() (Address string, ServiceConfig *ServiceConfig, err error) {
	if c.Type == TypeService {
		return c.Address, c.Service, nil
	}
	return "", nil, fmt.Errorf(ErrInvalidConfigType)
}

func (c *Config) IsDiscovery() (Address string, DiscoveryConfig *DiscoveryConfig, err error) {
	if c.Type == TypeDiscovery {
		return c.Address, c.Discovery, nil
	}
	return "", nil, fmt.Errorf(ErrInvalidConfigType)
}

type ServiceConfig struct {
	// 服务ID，唯一标识一个服务实例
	ID string `json:"id"`

	// 服务名称，同一类服务共享同一名称
	Name string `json:"name"`

	// 服务地址
	Address string `json:"address"`

	// 服务端口
	Port int `json:"port"`

	// 健康检查路径
	CheckPath string `json:"check_path"`
}

type DiscoveryConfig struct {
	// 是否启用服务发现
	Enabled bool `json:"enabled"`

	// 要发现的服务列表
	Services []*DiscoveryService `json:"services"`

	// 长轮询等待时间
	WaitTime int `json:"wait_time"`

	// HTTP 请求超时时间
	Timeout int `json:"timeout"`

	// 最大重试延迟
	RetryMaxDelay int `json:"retry_max_delay"`
}

type DiscoveryService struct {
	// 服务名称
	Name string `json:"name"`

	// 是否必需（必需服务不可用时可能影响启动）
	Required bool `json:"required"`
}

func (dc *DiscoveryConfig) FindServiceByName(name string) (*DiscoveryService, error) {
	for i := range dc.Services {
		if dc.Services[i].Name == name {
			return dc.Services[i], nil
		}
	}
	return nil, fmt.Errorf(ErrServiceNotFound)
}
